// JavaScript Document
//require MyClass.js
//require MySortArray.js

GestorDirCercanos = new MyClass({
	/**  
     * Property: id
	 * 	 Identificador de gestor dir cercanos. 
     * {String} 
     */							
	id: null,							
	/**  
     * Property: lat
	 * 	 Latitud del punto a calcular la cercania. 
     * {String | Float} 
     */							
	lat: null,
	/**  
     * Property: lon
	 * 	 Longitud del punto a calcular la cercania. 
     * {String | Float} 
     */
	lon: null,
	/**  
     * Property: movilesId
	 * 	 Array con los ID de los moviles a evaluar la cercania 
     * {Array} 
     */
	movilesIds: null,	
	/**  
     * Property: isFromGestorDir
	 * 	 Flag que indica si las coordenadas provienen de un punto tipo GestorDir o MisPuntos 
     * {Boolean} 
     */
	isFromGestorDir: false,
	
	/**  
     * Property: movilesId
	 * 	 Array con objetos del ultimo resultado de cercanias calculado, ordenado por distancias, ascendentemente.
     * {Array[Object]} : Object: (movilId, distance);
     */	
	movilesDistances: null,
	
	/**  
     * Property: POPUP
	 * 	 referencia al objeto PopUp
     * {OBJECT};
     */	
	POPUP: null,
		
	init: function(opciones){
		this.movilesIds = new Array();
		this.movilesDistances = new Array();
		for (var key in opciones) {
			this[key] = opciones[key]; 
		}
	},	
	
	/**  
     * Property: distanceToMovil
	 * 	 Calcula la distancia de un punto al movil.
     * Params:
     *   movilId - {String}
	 * Return:
	 *	 {Float | null} - Distancia calculada o 'false' en caso de error.
     */
	distanceToMovil: function(movilId){						
		var movil = misVehiculosHash.get(movilId.toString());
		if (movil==null) return null;	
		//if (!parseInt(movil.activo)) return null; //NO TIENE EN CUENTA LOS MOVILES INACTIVOS.
		var posiMovil = movil.POSIMOVIL;
		if (posiMovil==null) return null;		
		var movilLat = parseFloat(posiMovil.latitud);
		var movilLon = parseFloat(posiMovil.longitud);
		if (isNaN(movilLat)||isNaN(movilLon)) return null;
		var ptoLat = parseFloat(this.lat);
		var ptoLon = parseFloat(this.lon);
		var R = 6371; // km, radio de la tierra
		var dLat = (movilLat-ptoLat)*(Math.PI / 180);
		var dLon = (movilLon-ptoLon)*(Math.PI / 180); 
		var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
        		Math.cos(movilLat*(Math.PI / 180)) * Math.cos(ptoLat*(Math.PI / 180)) * 
        		Math.sin(dLon/2) * Math.sin(dLon/2); 
		var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
		var d = R * c;
		return d;
	},
	
	/**  
     * Property: calculate
	 * 	 Calcula la distancia de todos los moviles al punto.
     * Params:
     *   [movilesIds] - {Array[String]}
	 * Return:
	 *	 {Array[Object]} : Object: (movilId, distance);
     */
	calculate: function(movilesIds){
		if (movilesIds!=null){
			this.movilesIds = movilesIds;
		}
		var distances = new Array();
		for (var i=0; i<this.movilesIds.length; i++){
			var d = this.distanceToMovil(this.movilesIds[i]);
			if (d){
				var distMovil = new Object();
				distMovil.movilId = this.movilesIds[i].toString();
				distMovil.distance = d;
				distances.push(distMovil);
			}
		}
		//ordenar el array distances ascendentemente por la property distance
		var mySortArray = new MySortArray(distances);
		mySortArray.ordenar('A','distance');		
		this.movilesDistances = distances;
		return distances;				
	},	
	/**  
     * Property: distanceDWBToMovil
	 * 	 Calcula la distancia en auto/pie/bicicleta de un punto al movil.
     * Params:
     *   movilId - {String}
	 * Return:
	 *	 {Float | null} - Distancia calculada o 'false' en caso de error.
     */
	distanceDWBToMovil: function(gDC,gD,vehiculosVisiblesId,cant,i,distances,idCercanos,modoViaje){
    	if(cant==0){
    		var mySortArray = new MySortArray(distances);
    		mySortArray.ordenar('A','distance');	
    		this.movilesDistances = distances;
    		
            printTableMovilesCercanosPunto(gDC,modoViaje);
            
            var nombrePunto = ((this.isFromGestorDir) ? gD.name : gD.nombre);
            var div = document.createElement('div');
            
            div.appendChild(document.getElementById('containerMCP'+gDC.id));
            
            dejarDeSeguir();
            this.POPUP 		= dhtmlwindow.open('windowMCP_'+idCercanos, 'div', div, 'Cercanos a "'+nombrePunto+'"', 'width=360px,height=510px,left=200px,top=150px,resize=0,scrolling=1');
            this.onclose 	= function(){gDC.POPUP = null;};
    		return distances;
    	}else{
	    	var movil 	= misVehiculosHash.get(vehiculosVisiblesId[i].toString());
			var movilId = vehiculosVisiblesId[i].toString();
			//if (movil==null) return null;	//if (!parseInt(movil.activo)) return null; //NO TIENE EN CUENTA LOS MOVILES INACTIVOS.
			
			var posiMovil = movil.POSIMOVIL;
			if (posiMovil!=null){
				var movilLat = parseFloat(posiMovil.latitud);
				var movilLon = parseFloat(posiMovil.longitud);
				if (isNaN(movilLat)||isNaN(movilLon)){
					return null;
				}
				var ptoLat = parseFloat(this.lat);
				var ptoLon = parseFloat(this.lon);
				var request = {
						origin: null,
						destination:  null,
						travelMode: modoViaje,
						region: "es"
				};
				var oParams 	= new Object();
				oParams.peticion= "mispuntos";
				oParams.gDC		= gDC;
				oParams.gD 		= gD;
				oParams.vehiculosVisiblesId = vehiculosVisiblesId;
				oParams.cant 	= cant;
				oParams.i 		= i;
				oParams.distances	= distances;
				oParams.idCercanos 	= idCercanos;
				oParams.modoViaje 	= modoViaje;
				oParams.movilLat 	= movilLat;
				oParams.movilLon 	= movilLon;
				oParams.ptoLat 		= ptoLat;
				oParams.ptoLon 		= ptoLon;
				
				cGeoController.getRoute(request,oParams);
				
//				if (GBrowserIsCompatible()) {
//			        gdir = new google.maps.DirectionsService();
//			        gdir.route(request, function(response, status) {
//			        	var dist="";
//			            if (status == google.maps.DirectionsStatus.OK) {
//			            	var myRoute 		= response.routes[0];
//			            	var myRouteBounds 	= myRoute.bounds;
//			                var myRouteLegs 	= myRoute.legs[0];
//			                var myRouteSteps 	= myRoute.legs[0].steps;
//			                dist 				= myRouteLegs.distance.value;
//			                distFormateado 		= myRouteLegs.distance.text;
//			                steps				= myRouteSteps;
//			                resp 				= response;
//			            }
//			            if (dist){
//			            	var distMovil = new Object();
//			            	distMovil.movilId = movilId;
//			            	distMovil.distance = dist;
//			            	distMovil.distanceText = distFormateado;
//			            	distMovil.steps = steps;
//			            	distMovil.legs  = myRouteLegs;
//			            	distMovil.resp  = resp;
//			            	distances.push(distMovil);
//			            }
//			            gDC.distanceDWBToMovil(gDC,gD,vehiculosVisiblesId,cant-1,i+1,distances,idCercanos,modoViaje);
//			        });
//				}
			}else{
				 gDC.distanceDWBToMovil(gDC,gD,vehiculosVisiblesId,cant-1,i+1,distances,idCercanos,modoViaje);
			}
    	}
    }
	
});